#include"d3dUtility.h"
#include"camera.h"
#include<ctime>
#include"pSystem.h"

IDirect3DDevice9*		Device = 0;

const int Width = 640;
const int Height = 480;

Camera TheCamera(Camera::AIRCRAFT);

bool Setup()
{
	srand((unsigned int)time(0));

	//	create basic scene
	d3d::DrawBasicScene(Device,1.0f);

	//	set projection matrix
	D3DXMATRIX proj;
	D3DXMatrixPerspectiveFovLH( &proj,
								D3DX_PI / 4.0f,
								(float)Width/(float)Height,
								1.0f,
								5000.0f);
	Device->SetTransform(D3DTS_PROJECTION,&proj);
	return true;
}

void Cleanup()
{
	
}

bool Display(float timeDelta)
{
	if( Device)
	{
		//	update camera
		if( ::GetAsyncKeyState('W') & 0x8000f )
			TheCamera.walk(4.0f * timeDelta);
		if( ::GetAsyncKeyState('S') & 0x8000f )
			TheCamera.walk(-4.0f * timeDelta);
		if( ::GetAsyncKeyState('E') & 0x8000f )
			TheCamera.strafe(4.0f * timeDelta);
		if( ::GetAsyncKeyState('Q') & 0x8000f )
			TheCamera.strafe(-4.0f * timeDelta);
		if( ::GetAsyncKeyState('D') & 0x8000f )
			TheCamera.yaw(1.0f * timeDelta);
		if( ::GetAsyncKeyState('A') & 0x8000f )
			TheCamera.yaw(-1.0f * timeDelta);

		if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f )
			TheCamera.pitch(1.0f * timeDelta);
		if( ::GetAsyncKeyState(VK_UP) & 0x8000f )
			TheCamera.pitch(-1.0f * timeDelta);
		if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f )
			TheCamera.roll(-1.0f * timeDelta);
		if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f )
			TheCamera.roll(1.0f * timeDelta);

		D3DXMATRIX V;
		TheCamera.getViewMatrix(&V);
		Device->SetTransform(D3DTS_VIEW, &V);


		//	render scene
		Device->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000,1.0f,0);
		Device->BeginScene();

		D3DXMATRIX I;
		D3DXMatrixIdentity(&I);
		Device->SetTransform(D3DTS_WORLD,&I);
		d3d::DrawBasicScene(Device,1.0f);


		//	render test point sprite
		Device->SetTransform(D3DTS_WORLD,&I);

		Device->EndScene();
		Device->Present(0,0,0,0);
	}

	return true;
}


LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch( msg )
	{
	case WM_DESTROY:
		::PostQuitMessage(0);
		break;
		
	case WM_KEYDOWN:
		if( wParam == VK_ESCAPE )
			::DestroyWindow(hwnd);
		break;
	}
	return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE prevInstance,PSTR cmdLine,int showCmd)
{
	if(!d3d::InitD3D(hInstance,Width,Height,true,D3DDEVTYPE_HAL,&Device))
	{
		MessageBox(0,L"InitD3D() - FAILED",0,0);
		return 0;
	}

	if(!Setup())
	{
		MessageBox(0,L"Setup() - FAILED",0,0);
		return 0;
	}

	d3d::EnterMsgLoop( Display);

	Cleanup();

	Device->Release();

	return 0;
}